4.0 Middleware Overview
本章介绍 LangChain 中的中间件系统,让你能够精细控制 Agent 的执行过程。
什么是 Middleware?
Middleware(中间件) 提供了一种更紧密控制 Agent 内部行为的方式。它让开发者能够在 Agent 执行的多个生命周期点进行拦截和自定义。
"Middleware provides a way to more tightly control what happens inside the agent."
核心用途
| 用途 | 说明 | 示例 |
|---|---|---|
| 监控与分析 | 追踪 Agent 行为 | 日志、分析、调试 |
| 转换 | 修改输入输出 | 提示词修改、工具选择、输出格式化 |
| 弹性 | 增强可靠性 | 重试、降级、提前终止 |
| 安全与限制 | 保护和约束 | 速率限制、护栏、PII 检测 |
Agent 执行循环
Agent 的核心执行流程由三个步骤组成:
┌─────────────────────────────────────────────────────────┐
│ Agent Loop │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────┐ │
│ │ Model Call │───►│ Tool Select │───►│ Complete │ │
│ │ │ │ & Execute │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Middleware Hooks │ │
│ │ before_model → after_model → wrap_tool_call │ │
│ └──────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘执行步骤:
- Model Call - 模型进行决策
- Tool Selection & Execution - Agent 选择并执行工具
- Completion - 当不再调用工具时,流程结束
中间件的作用:在每个步骤的前后暴露钩子,允许对 Agent 行为进行精细控制。
基本使用
中间件直接集成到 Agent 创建过程中:
python
from langchain.agents import create_agent
from langchain.agents.middleware import SummarizationMiddleware
agent = create_agent(
model="gpt-4o",
tools=[search, calculate],
middleware=[
SummarizationMiddleware(max_tokens=4000),
]
)多个中间件
可以组合多个中间件:
python
from langchain.agents.middleware import (
SummarizationMiddleware,
ModelCallLimitMiddleware,
HumanInTheLoopMiddleware,
)
agent = create_agent(
model="gpt-4o",
tools=[my_tools],
middleware=[
SummarizationMiddleware(max_tokens=4000),
ModelCallLimitMiddleware(max_calls=10),
HumanInTheLoopMiddleware(tools=["send_email"]),
]
)中间件执行顺序
请求进入
│
▼
┌───────────────────────────────────────┐
│ Middleware 1: before_model │
│ Middleware 2: before_model │
│ Middleware 3: before_model │
└───────────────────────────────────────┘
│
▼
┌───────────────────────────────────────┐
│ Model Execution │
└───────────────────────────────────────┘
│
▼
┌───────────────────────────────────────┐
│ Middleware 3: after_model │
│ Middleware 2: after_model │
│ Middleware 1: after_model │
└───────────────────────────────────────┘
│
▼
响应返回- Before hooks:按添加顺序执行(先进先出)
- After hooks:按相反顺序执行(后进先出)
- Wrap hooks:像函数调用一样嵌套
中间件类型
内置中间件
LangChain 提供多种开箱即用的中间件:
| 类别 | 中间件 | 功能 |
|---|---|---|
| 上下文管理 | Summarization | 自动摘要对话历史 |
| 执行控制 | ModelCallLimit | 限制 API 调用次数 |
| 安全合规 | HumanInTheLoop | 人工审批 |
| 弹性 | ModelFallback | 模型降级 |
自定义中间件
当内置中间件不满足需求时,可以创建自定义中间件:
python
from langchain.agents import before_model
@before_model
def log_messages(state, runtime):
"""记录每次模型调用"""
print(f"消息数: {len(state['messages'])}")
return None常见使用场景
1. 防止无限循环
python
from langchain.agents.middleware import ModelCallLimitMiddleware
agent = create_agent(
"gpt-4o",
tools=[my_tools],
middleware=[ModelCallLimitMiddleware(max_calls=20)]
)2. 敏感操作审批
python
from langchain.agents.middleware import HumanInTheLoopMiddleware
agent = create_agent(
"gpt-4o",
tools=[send_email, delete_file],
middleware=[
HumanInTheLoopMiddleware(
tools=["send_email", "delete_file"]
)
]
)3. 上下文管理
python
from langchain.agents.middleware import SummarizationMiddleware
agent = create_agent(
"gpt-4o",
tools=[my_tools],
middleware=[
SummarizationMiddleware(
max_tokens=4000,
summary_model="gpt-3.5-turbo"
)
]
)4. 错误恢复
python
from langchain.agents.middleware import ModelFallbackMiddleware
agent = create_agent(
"gpt-4o",
tools=[my_tools],
middleware=[
ModelFallbackMiddleware(
fallback_model="gpt-3.5-turbo"
)
]
)本章内容
| 章节 | 内容 | 核心概念 |
|---|---|---|
| 4.1 Built-in Middleware | 内置中间件 | 12+ 开箱即用的中间件 |
| 4.2 Custom Middleware | 自定义中间件 | 装饰器、类、钩子 |
最佳实践
- 保持专注 - 每个中间件只做一件事
- 优雅处理错误 - 中间件中的错误不应导致整个 Agent 崩溃
- 注意顺序 - 中间件的执行顺序很重要
- 性能考虑 - 避免在中间件中执行耗时操作
- 测试充分 - 使用 LangSmith 进行集成测试